Numpy 常用語法


Posted by pei_______ on 2022-06-23

numpy的特色

  1. 用陣列代替列表處理資料
  2. 適合處理多維度的資料
  3. pandas、tensorflow的基礎
  4. 運算速度遠高於列表(核心使用C、C++運作)

一、資料建立


01. numpy.array

# 一維資料

data = np.array([3, 4, -5])

# 二維資料

data = np.array([
    [1, 2], 
    [3, 2], 
    [4, 0]
])

# 三維資料

data = np.array([
    [
        [5, 2, 4], [1, 2, 8],
    ],
    [
        [3, 8, 2], [4, 3, 1]
    ]
])

02. numpy.empty / zeros / ones / arange

# 建立空白資料
data = np.empty(3)

# 建立全0的資料
data = np.zeros([3, 2])

# 建立全1的資料
data = np.ones([2, 2, 2])

# 建立範圍(a ~ b-1)的資料
data = np.range(a, b)

二、資料運算


01. 逐元運算 (兩個數據的數量及維度要相同)

data1 = np.array([3, 2, 10])
data2 = np.array([1, 3, 6])

data1 + data2
data1 - data2
data1 * data2
data1 / data2
data1 > data2
data1 == data2

02. 矩陣運算

'''
# 內積矩陣運算 (第一個矩陣後面維度 = 第二個矩陣前面維度)

| 1 |   | 1 5 |   | 16 | (1 * 1 + 3 * 5)
| 3 | x | 4 2 | = | 10 | (1 * 4 + 3 * 2)
        | 5 2 |   | 11 | (1 * 5 + 3 * 2)

 1x2  X   2x3   =   1x3         
'''

data1 = np.array([
    [1, 3]
])

data2 = np.array([
    [1, 4, 5],
    [5, 2, 2]
])

# 內積 (得到 1 x 3矩陣)
result = data1.dot(data2)
result = data1 @ data2
'''
# 外積矩陣運算
| 1  4  5  5  2  2 | ( 1 * 所有)
| 3 12 15 15  6  6 | ( 3 * 所有)

 1x2  X   2x3   =   2x6
'''

# 外積 
result = np.outer(data1, data2)

03. 統計運算 (只要一個多維資料即可)

data = np.array([
    [2, 1, 7],
    [-5, 3, 8]
])

print(f"全部加總: {data.sum()}")
print(f"找到最大值: {data.max()}")
print(f"找到最小值: {data.min()}")
print(f"平均數: {data.mean()}")
print(f"標準差: {data.std()}")
print(f"針對第一個維度(column)做總和: {data.sum(axis=0)}")
print(f"針對第二個維度(row)做總和: {data.sum(axis=1)}")
print(f"逐值累加: {data.cumsum()}")

三、資料形狀 Shape / T / reShape


import numpy as np
'''
維度 Dimension: 資料的層次 ex. 1, 2, 3
形狀 Shape: 表達資料的層次和各層次的資料數量 ex. [8], [2,4], [2, 2, 2]
'''

data = np.array([[1, 2], [3, 2], [4, 0]])

# 觀察資料形狀 (3 x 2)
print(data.shape)

# 轉置資料 (2 x 3), 常用在矩陣
print("--- 轉置前 ---")
print(data)
print("--- 轉置後 ---")
print(data.T)

# 扁平化 => 打平成一維資料 (1 x 7)
print(data.ravel())
print(data.ravel().shape)

# 重塑資料 => 重塑前後的資料總數要一致
shape1 = np.array([1, 2, 3, 4, 5, 6, 7, 8])
shape2 = shape1.reshape(4, 2)

# 亦可用在資料初始化
initialize = np.zeros(18).reshape(2, 3, 3)
print(initialize)

四、資料索引 Index & 資料切片 Slice


import numpy as np

data = np.array([
    [1, 3, -1],
    [1, 2, 3],
    [5, -5, 3],
    [3, 5, 1]
])

# 索引 Index (從0開始)
index_data = data[1, 2]

# 切片 Slice (包含前面,不包含後面)
# ex. [a:b] 擷取 a ~ b-1
# ... 表示都要
slice_data = data[..., 2:4]  # 保留前面全部的層次

五、合併矩陣 vStack & hStack


import numpy as np

# 合併第一個維度
# np.vstack((陣列一, 陣列二, ...))

# 合併第二個維度
# np.hstack((陣列一, 陣列二, ...))

arr1 = np.array([[1, 2, 3], [4, 5, 6]])  # 2 x 3
arr2 = np.array([[7, 8, 9], [10, 11, 12]])  # 2 x 3
arr3 = np.array([[13, 14], [15, 16]])  # 2 x 2
result1 = np.vstack((arr1, arr2))  # 合併第一個維度: '4' x 3
result2 = np.hstack((arr1, arr2, arr3))  # 合併第二個維度: 2 x '8'
print(result1)  # [[1 2 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
print(result2)  # [[1, 2, 3, 7, 8, 9, 13, 14], [4, 5, 6, 10, 11, 12, 15, 16]]

六、切割矩陣 vSplit & hSplit


import numpy as np

# 切割第一個維度
# np.vsplit(陣列, 切割數量)

# 切割第二個維度
# np.hsplit(陣列, 切割數量)

arr1 = np.array([[1, 2, 3, 4],
                 [5, 6, 7, 8]])  # 2 x 4

result1 = np.vsplit(arr1, 1)  # 切割第一個維度成1個: 2 x 4
result2 = np.vsplit(arr1, 2)  # 切割第一個維度成2個: 1 x 4 + 1 x 4
result3 = np.hsplit(arr1, 1)  # 切割第二個維度成1個: 2 x 4
result4 = np.hsplit(arr1, 2)  # 切割第二個維度成2個: 2 x 2 + 2 x 2
result5 = np.hsplit(arr1, 4)  # 切割第二個維度成4個: 2 x 1 + 2 x 1 + 2 x 1 + 2 x 1









Related Posts

Redux, connect

Redux, connect

【THM Walkthrough】Lateral Movement and Pivoting (1)

【THM Walkthrough】Lateral Movement and Pivoting (1)

This is shell script for example code

This is shell script for example code


Comments